package com.itheima.edu.info.manager.controller;

import com.itheima.edu.info.manager.domain.Option;
import com.itheima.edu.info.manager.domain.Teacher;
import com.itheima.edu.info.manager.util.AgeUtil;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class TeacherController {
    //用户录入信息的扫描类
    Scanner sc = new Scanner(System.in);

    //该方法是用来获取一个指定的客户端套接字socket("127.0.0.1", 10100)
    public Socket getSocket() {
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1", 10100);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            return socket;
        }
    }

    //二级菜单主界面-----教师用户管理系统(服务端)
    public void start() {
        while (true) {
            System.out.println("=========================欢迎您来到老师管理系统==========================");
            System.out.println("请输入您的选择:1.增加老师信息\t2.删除老师信息\t3.修改老师信息.\t4.查看老师信息\t5.退出系统");
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    addTeacher();
                    break;
                case 2:
                    deleteTeacher();
                    break;
                case 3:
                    updateTeacher();
                    break;
                case 4:
                    selectTeacher();
                    break;
                case 5:
                    System.out.println("感谢您的使用,下次再见!");
                    System.exit(0);
                    break;
                default:
                    System.out.println();
                    break;
            }
        }
    }

    //客服:删除老师的信息
    private void deleteTeacher() {
        //获取一个存在的老师id
        String id = InputGetId(true);
        //3. 向服务端发送请求:进行删除业务,服务端返回信息
        String receiveServer = sendDataToReceiveServer(Option.DELETE_TEACHER+"&" + id);
        //4. 给出用户: 删除结果的提示信息
        if ("true".equals(receiveServer)) {
            System.out.println("\t\t\t\t\t\t删除成功!");
        } else {
            System.out.println("\t\t\t\t\t\t删除失败!");
        }
    }

    //客服:修改老师信息
    private void updateTeacher() {
        //获取一个存在的老师id
        String id = InputGetId(true);
        //根据id录入老师其他信息并封装成对象
        Teacher tea = byIdGetTeacher(id);
        //5. 向服务端发送请求进行修改业务,将要修改的学生对象发送给服务端
        //service.updateStudentById(updateId, newStu);
        String receiveServer = sendDataToReceiveServer(Option.UPDATE_TEACHER+"&" + tea.toString());
        //6. 给出修改结果的提示信息
        if ("true".equals(receiveServer)) {
            System.out.println("\t\t\t\t\t\t修改成功!");
        } else {
            System.out.println("\t\t\t\t\t\t修改失败!");
        }
    }

    //客服:查找所有的老师信息
    private void selectTeacher() {
        //向服务端发送信息表示客户端的操作是查找所有学生
        //返回学生信息的字符串表示形式
        String allTea = sendDataToReceiveServer(Option.FIND_TEACHER+"&void");
        //根据服务端返回的数据来组织对应的查看逻辑
        //集合为空提示用户输入信息,否则打印集合信息
        if (allTea != "") {
            //分割成多个老师对象
            String[] teas = allTea.split("=");
            //切割生成老师对象
            System.out.println("老师id\t老师姓名\t老师年龄\t老师生日");
            for (String tea : teas) {
                String[] split = tea.split(",");
                Teacher teax = new Teacher(split[0],split[1],split[2],split[3]);
                System.out.println(teax.show());
            }
        } else {
            System.out.println("您要查找的信息还没有添加呢,请尽快添加数据...");
        }
    }

    //增加老师信息
    private void addTeacher() {
        //获取一个不存在的老师id
        String id = InputGetId(false);
        //根据id录入老师其他信息并封装成对象
        Teacher tea = byIdGetTeacher(id);
        //发送指定格式的数据,receiveServer:并接收字符串形式的布尔值
        String receiveServer = sendDataToReceiveServer(Option.ADD_TEACHER+"&" + tea.toString());
        //4. 根据服务端返回的结果,组织对应的输出信息给用户: 添加成功/添加失败
        if ("true".equals(receiveServer)) {
            System.out.println("\t\t\t\t\t\t添加成功!");
        } else {
            System.out.println("\t\t\t\t\t\t添加失败!");
        }
    }

    //根据参数要求获得正确老师的id
    private String InputGetId(boolean flag) {
        System.out.println("\t\t\t\t\t\t请输入老师id:");
        //定义变量id
        String id;
        //循环录入id为了获取满足要求的老师id
        while (true) {
            //录入老师id
            id = sc.next();
            String str = Option.ISEXISTS_TEACHER +"&" + id;
            //str是客户端发送给服务器的数据.data是服务器返回的布尔类型的数据(字符串形式)
            String data = sendDataToReceiveServer(str);
            //判断该id(地铁编号)是否满足需求,满足则跳出循环,否则继续录入地铁编号
            if ("true".equals(data) == flag) {
                break;
            }
            System.out.println("您输入的id,不符合要求,请您重新输入...");
        }
        return id;
    }

    //录入老师用户的信息
    public Teacher byIdGetTeacher(String id) {
        //录入老师信息
        System.out.println("\t\t\t\t\t\t请输入老师的姓名:");
        String name = sc.next();
        System.out.println("\t\t\t\t\t\t请输入老师生日:");
        String birthday = sc.next();
        //封装老师信息为对象
        return new Teacher(id, name, AgeUtil.getAge(birthday), birthday);
    }

    //控制层的老师登录功能
    public void login() {
        System.out.println("进入老师管理系统请先登录,谢谢!");
        //1.设置允许登录的次数
        for (int i = 1; i <= 3; i++) {
            //录入用户登录的信息
            System.out.println("\t\t\t\t\t\t请输入用户名:");
            String name = sc.next();
            System.out.println("\t\t\t\t\t\t请输入密码:");
            String password = sc.next();
            //str是客户端发送给服务器的数据
            String str = Option.LOGIN_TEACHER+"&" + name + "," + password;
            //将用户登录相关的数据发送给服务端,并使用serverData接收服务端端发送来的数据
            String serverData = sendDataToReceiveServer(str);
            //判断服务端发送来的数据是否为true,是则登录成功,否则登录失败
            if ("true".equals(serverData)) {
                System.out.println("\t\t\t\t\t\t恭喜您,登录成功!");
                break;
            } else {
                if (i == 3) {
                    System.out.println("您今天没有登录机会了...");
                } else {
                    System.out.println("您今天还剩" + (3 - i) + "次登录机会");
                }
            }
        }
    }

    //该功能用来将str(数据)发送给服务端,并接收服务端返回的字符串信息
    public String sendDataToReceiveServer(String str) {
        //获得套接字,必须使用一个套接字,发送和接收数据,与服务端保持一致,否则出现异常,提示:套接字关闭
        Socket sk = getSocket();
        try {

            //创建一个字符缓冲输出流
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
            //将要发送的数据写入流中
            bw.write(str);
            //换行
            bw.newLine();
            //刷新流
            bw.flush();
            //中止字符缓冲输出流流
            sk.shutdownOutput();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("异常.......");
        }
        String str1 = null;
        try {
            //创建一个字符缓冲输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
            //str1:读取服务端发送来的数据
            str1 = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("getServerData方法异常...........");
        } finally {
            //返回服务端返回的信息
            return str1;
        }
    }


}
